-----------------------------------------------------------------------------------------
-- 文字说明
-- number 型别内含两种表示法，分别为 整数 和 浮点数。对于何时使用哪种表示法，Lua 有明确的规则，但也会视需求（详见 §3.4.3）进行自动转换。因此，程式设计者可以选择大体上忽视整数与浮点数间的差异，但也可进一步完全控制每个 number 的表示内容。标准 Lua 使用 64 位元整数及双倍精度（64 位元）浮点数，但是你也可以将 Lua 编译成使用 32 位元整数和单精度（32 位元）浮点数。小型机器或嵌入式系统特别合适用 32 位元来表示整数与浮点数。（详见 luaconf.h 中的 LUA_32BITS 巨集定义。）
-- Lua 对一些型别和值的内部表示会在运行时做一些数学转换。 位操作总是将浮点操作数转换成整数。 乘方和浮点除法总是将整数转换为浮点数。 其它数学操作若针对混合操作数 （整数和浮点数）将把整数转换为浮点数； 这一点被称为 通常规则。 C API 同样会按需把整数转换为浮点数以及 把浮点数转换为整数。 此外，字串连接操作除了字串，也可以接受数字作为参数。
-- 当操作需要数字时，Lua 还会把字串转换为数字。
-- 当把一个整数转换为浮点数时， 若整数值恰好可以表示为一个浮点数，那就取那个浮点数。 否则，转换会取最接近的较大值或较小值来表示这个数。 这种转换是不会失败的。
-- 将浮点数转为整数的过程会检查 浮点数能否被准确的表达为一个整数 （即，浮点数是一个整数值且在整数可以表达的区间）。 如果可以，结果就是那个数，否则转换失败。
-----------------------------------------------------------------------------------------
-- 代码演示
print("########")
local x = 2
local y = 2.0
print(x, y)
-- 1、上面x,y的定义在内存中是一不一样的方式进行存储的
-- x是long
-- y是double
-----------------------------------------------------------------------------------------
-- double和long对数字的影响
print("########")
-- 1、pow会获得double类型的数据
x = math.pow(2, 3)
-- 2、位操作符获得long类型的数据
y = x << 0
print(x, y)
-- 3、[**-53. **53]是整数使用的安全边界，在边界内是可以不区分long与double的
--   [-9007199254740992, 9007199254740992] 16位
print("########")
x = math.pow(2, 53)
y = math.tointeger(x)
print(x, y)
print(x == y)
print(x + 1 == x, y + 1 == y)
--
x = -math.pow(2, 53)
y = math.tointeger(x)
print(x, y)
print(x == y)
print(x - 1 == x, y - 1 == y)
-----------------------------------------------------------------------------------------
-- long的边界[**63, **63 - 1] [-9223372036854775808, 9223372036854775807] 19位
print("########")
x = math.tointeger(9223372036854775807)
print(x, x + 1)
x = math.tointeger(-9223372036854775808)
print(x, x - 1)
-----------------------------------------------------------------------------------------
-- double向long装换
print("########")
-- 向下
x = math.tointeger(9007199254740992.0 + 1)
print(x)
-- 向上
x = math.tointeger(9007199254740994.0 + 1)
print(x)
-----------------------------------------------------------------------------------------
-- 整数常量越界后向double转换
print("########")
x = 9223372036854775807
print(x)
x = 9223372036854775808
print(x)